package com.hahaliu.hahaliu.service.impl.video;

import com.hahaliu.hahaliu.common.context.CurrentUser;
import com.hahaliu.hahaliu.common.exception.BaseException;
import com.hahaliu.hahaliu.common.utils.RedisUtil;
import com.hahaliu.hahaliu.service.video.VideoAuditService;
import com.hahaliu.hahaliu.service.video.VideoService;
import com.hahaliu.hahaliu.service.video.VideoStatsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.*;
import java.util.concurrent.Executor;

@Service
public class VideoAuditServiceImpl implements VideoAuditService {

    @Autowired
    private RedisUtil redisUtil;

    @Autowired
    private CurrentUser currentUser;

    @Autowired
    private VideoService videoService;

    @Autowired
    @Qualifier("taskExecutor")
    private Executor taskExecutor;

    /**
     * 查询对应状态的视频数量
     * @param status 状态 0审核中 1通过审核 2打回整改（指投稿信息不符） 3视频违规删除（视频内容违规）
     * @return 包含视频数量的CustomResponse对象
     */
    @Override
    public Long getTotalByStatus(Integer status) {
        if (!currentUser.isAdmin()) {
            throw new BaseException("您不是管理员，无权访问");
        }
        return redisUtil.scard("video_status:" + status);
    }

    /**
     * 获取分页对应状态的视频
     * @param status 视频状态
     * @param page 页码
     * @param quantity 每页数量
     * @return 符合条件的视频列表
     */
    @Override
    public List<Map<String, Object>> getVideosByPage(Integer status, Integer page, Integer quantity) {
        if (!currentUser.isAdmin()) {
            throw new BaseException("您不是管理员，无权访问");
        }
        List<Map<String, Object>> result = new ArrayList<>();
        // 从 redis 获取待审核的视频id集合，为了提升效率就不遍历数据库了，前提得保证 Redis 没崩，数据一致性采用定时同步或者中间件来保证
        Set<Object> set = redisUtil.getMembers("video_status:" + status);
        if (set != null && !set.isEmpty()) {
            // 如果集合不为空，则在数据库主键查询，并且返回没有被删除的视频
             result = videoService.getVideosWithDataByIds(set, page, quantity);

        }
        return result;
    }
}
